For these reasons (lots of work, greatly reduced compile/link speed, and diminishing returns), adding smart linking of virtual methods to the Delphi linker has not been a high priority for Borland.
I think there is another reason. Suppose somewhere in VCL is a "unused" virtual method in some base class. And then someone wrote a component that inherits this base class and overrides above mentioned "unused" method. What we get when the overridden implementation will call inherited implementation? If the compiler is "smart" enough to exclude the "unused" method we get something like access violation or incorrect processor instruction.

It's not impossible to devise a scheme to determine if a particular virtual method is never used in any descendants of a class type
It IS impossible because not all of descendants are even exists at compilation time. The author forgot that Delphi is a component-driven environment.
So I don't think it's a good idea to exclude "unused" virtual methods.

It's better to use objects instead of classes (and KOL instead of VCL) if you want to get a small application.