One popular alternative is inline caching that, I think, originates from Smalltalk systems.
Another alternative is having a type table per polymorphic method, instead of having a polymorphic method table (VMT) per type. It requires whole program analysis, but makes efficient multiple inheritance possible. Some Eiffel compilers use such a method (more here, look for "How do I implement multiple inheritance efficiently?").
The last one also mentions another method, a switch statement based approach (inspect in Eiffel ~ switch in C). SmartEiffel uses a variant of it, it makes a binary search based on the class ID. It also requires whole program analysis, but can sometimes be more efficient than VMT on current systems thanks to better instruction cache behavior. (more here, look for "Efficient Dynamic Dispatch without Virtual Function Tables").