It's good to see this being discussed!
You're correct that when the superclass relies on the default implementation of the protocol requirement, Swift doesn't add vtable entries for dynamic dispatch, and uses static dispatch instead.
One possible solution to this would be to 'opt-in' to vtable entries and dynamic dispatch by marking the method as an
override(invalid code today), while deprecating the old behavior or otherwise warning if override is not present and static dispatch will be used. It's unclear if we'd want to be able to silence the warning if someone really wanted to use static dispatch though. The result would be source compatible, but potentially confusing if we aren't able to warn about the current behavior, because forgetting to include override could introduce subtle bugs.
Edit: Another case that needs to be considered is an open class which uses a default implementation being subclassed from a different module.