Is it just me or is having to run multiple instances of a web server to scale a hack?
Am I wrong in this?
Clarification
I am referring to how I read people run multiple instances of a web service on a single server.  I am not talking about a cluster of servers.
Your assumption that Tomcat's and IIS's single process per server is superior is flawed.  The choice of a multi-threaded server and a multi-process server depends on a lot of variables.
One main thing is the underlying operating system.  Unix systems have always had great support for multi-processing because of the copy-on-write nature of the fork system call.  This makes multi-processes a really attractive option because web-serving is usually very shared-nothing and you don't have to worry about locking.  Windows on the other hand had much heavier processes and lighter threads so programs like IIS would gravitate to a multi-threading model.
As for the question to wether it's a hack to run multiple servers really depends on your perspective.  If you look at Apache, it comes with a variety of pluggable engines to choose from.  The MPM-prefork one is the default because it allows the programmer to easily use non-thread-safe C/Perl/database libraries without having to throw locks and semaphores all over the place.  To some that might be a hack to work around poorly implemented libraries. To me it's a brilliant way of leaving it to the OS to handle the problems and letting me get back to work.
Also a multi-process model comes with a few features that would be very difficult to implement in a multi-threaded server.  Because they are just processes, zero-downtime rolling-updates are trivial.  You can do it with a bash script.  
It also has it's short-comings.  In a single-server model setting up a singleton that holds some global state is trivial, while on a multi-process model you have to serialize that state to a database or Redis server.  (Of course if your single-process server outgrows a single server you'll have to do that anyway.)
Is it a hack? Yes and no.  Both original implementations (MRI, and CPython) have Global Interpreter Locks that will prevent a multi-core server from operating at it's 100% potential.  On the other hand multi-process has it's advantages (especially on the Unix-side of the fence).
There's also nothing inherent in the languages themselves that makes them require a GIL, so you can run your application with Jython, JRuby, IronPython or IronRuby if you really want to share state inside a single process.
having to run multiple instances of a web service for ruby/python seems like a hack to me