Polymorphic dispatch from an OOP perspective also solves the problem. Instead of building the logic for the code in the user, build a common interface for the objects and have the object itself define what happens in the specific situation.

Only in "clean" shape, animal, device-driver, and stack examples. The real world often dispatches on multiple orthogonal criteria such that OO polymorphism cannot handle it nicely because polymorphism is mostly mono-dispatch.

Nor is it always convenient to make a seperate class for every combination of multiple orthogonal dispatching factors in order to partition them. At least case statements can be turned into IF statements when things get complex without having to do the Class Shuffle. Thus, case statements are more change-resistent.

And, yes, Control Tables as a method of dispatch will go unmentioned

Generally not a strong candidate unless the case list gets long and/or is duplicated in multiple spots.