Fact: PHP and ASP.NET are single-threaded (I don't know about Ruby, though). Every request will spawn a new instance of the whole program, either as new process or inside the VM. That's quite a lot of overhead!
Node.JS is not single-threaded. It is comparable to a Java server, but with a twist. In fact, for every I/O operation, a new thread is automatically spawned. That's possible because of the asynchronicity and the internal event loop. This kind of architecture results in a very very low overhead and very good performance for I/O with many concurrent clients.
On top of that, Node.JS can be scaled easily. There is the cluster module, which allows you to spawn several processes you control (with whatever code you want, you don't even need a separate JS file), which are automatically connected via IPC channels.
Sidenote: JS is not made for number crunching. If you need to do heavy calculations, you should use a different language (use the right tool for the right job), for example Rust. Node.JS has its forte in I/O!