Agreed -- pretty much any programming construct has appropriate uses as well as abuses. Switch is good when you have a set of well-known values and you want to show that you're selecting between members of a limited set. Nested if-else is useful when the conditions for each case are independent of each other, or there are only a couple of choices. Function dispatch is great when the selection set or conditions change at runtime. This is a bit of an ambiguous case, so there's room for debate -- but the ultimate goal should be to achieve clarity and to minimize the probability of bugs, both now and in maintenance.

In my career, I've found justifiable use for all sorts of "considered harmful" constructs -- goto, redefined macros in C (although fortunately never [Duff's Device](http://en.wikipedia.org/wiki/Duff's_device)), multiple statements per line, leaving out the curly brackets on a conditional, etc. It's all about expressing intent *clearly*.