The simple fact is that many, if not most, C++ users can hardly grasp that vector is better than malloc and free, so the number who can not only appreciate but implement advanced template metaprogramming is not very high. This implies that even if it were good for 90% of situations, you'd see it in far less, simply because people don't know about it or how to use it.
However, virtual functions do have advantages, namely, virtual functions are much easier to use than the CRTP. C++ templates are notorious for being bitchy about virtually anything and everything, and the inclusion model sucks balls.
However, they [virtual functions] are distinctly slower and less powerful. For example, I right now am writing code using the CRTP, where you inherit operator overloads for use with expression templates. There's no way virtual functions could possibly make that work.