Node is slower than a modern typed VM like the Java on the JVM or C# on .NET. Let's get that out of the way right now - Java is faster than Javascript. The reason is that Javascript source lacks a lot of info needed to efficiently map it to machine code, so V8 and other fast JSVM's all have to rely heavily on speculation. That's a fancy way of saying they guess what the code might do, compile that, and then recompile it again if it turns out they were wrong (or if the code actually changes itself at runtime which is not uncommon for dynamic languages).
Now to be clear, Java itself is actually a kind of hybrid static/dynamic language. For example all code is lazy linked and you can generate and load new code at runtime as well, if you want. All method calls are virtual by default etc. The JVM requires tons of complexity and machinery to make all that work with acceptable performance ... but it's still able to do a better job than with Javascript because the code contains more static type info up front.
So why do people think Node is fast? A couple of reasons. Partly it's because the sorts of people who are attracted to Node are the sorts of people who were previously using languages like Python, Ruby and PHP. Compared to the interpreters for those languages, V8 and thus Node really is very fast. Python/Ruby/etc don't speculate or produce machine code at all (though their JVM versions do). So, for people who code in the dynamic languages space, Node is a big step up.
Secondly, Node apps have a nasty habit of being built on NoSQL-ish database layers like MongoDB. These databases were being developed and getting hip around the same time that Node was becoming popular, so there are asynchronous database drivers for them. "Nasty" because they seem to be very frequently applied in cases where they aren't appropriate. BTW I say that as a former professional BigTable administrator, so I'm not a n00b when it comes to NoSQL databases.
In contrast most of the people developing Java/.NET web apps are usually developing business apps of various kinds and have older code bases, so they are using MySQL, PostgreSQL, Oracle, etc ..... more traditional relational databases which have only blocking drivers. That means for any web app that does database work i.e. all of them, the Java web servers will spend most of their time waiting around for the database. Whilst doing so they are holding thread stacks in memory. Thread stacks generally have to be sized at creation time for the worst case scenario, which means they tend to be large. 1mb stacks are not unheard of. Node, in contrast, requires asynchronous code at all times because V8 is not thread safe. It doesn't give you any choice in the matter. A callback closure held on the heap tends to require much less memory than a thread stack, thus, you can suspend many more computations at once when programming in this style.
If you can suspend a lot more computations simultaneously for the same amount of RAM, then you can force more traffic through a single server before it runs out of memory and falls over. And though people tend to talk about tens of thousands or hundreds of thousands of threads not scaling, actually since a bunch of major upgrades many years ago (NPTL, constant time scheduler etc) Linux has been actually able to handle bazillions of threads. The problem is that requires a very unusual programming style to achieve due to the tiny stacks, and Java/.NET aren't really designed with it in mind, so in practice nobody makes servers that work this way.
All this is a long winded way of saying that the programming style Node forces you into is genuinely more memory efficient than the thread-per-request style, and if you can fit more requests into memory at once then it will appear that a single server can "go faster" .... even if technically the code executes slower.
But here's the catch. Is it worth it? You've been able to do asynchronous programming for a loooooong time, even in Java or C#. The reason most APIs and SQL database drivers in particular don't tend to support this model well is because it imposes high costs and many people feel it isn't worth it, so the demand for better library isn't there. The biggest problem is it results in a spaghetti-like jungle of callbacks which makes for very hard to read code. I used to work at Google and the callbacks-vs-threads debates had been running there a long time. The core web search servers were all C++ and async/callback based, partly because a web search cluster is an insanely expensive thing due to the fact that the index is held in RAM, so having 10,000 queries in flight in a single server was well worth the programming pain. But that sort of thing is rare. Most web apps are not web search or WhatsApp or Facebook thumbnail serving. Most web apps can tolerate requiring more RAM if the gain is straight line code that clearly spells out the order and control flow of what's happening, because ability to debug the code and hire non-wizard programmers is worth more than some incremental throughput gain.
And if you DO want to do entirely async programming, then .NET and the JVM have tools for you to do that. C# has the async/await keywords and the JVM has Quasar. You might have to give up your nice MySQL ORM to get them, or use a simple custom driver, but the same is true in the Node world anyway. Basically Quasar/.NET async perform clever compile-time bytecode rewriting tricks to let you write code that looks blocking and straight-line but is mangled behind the scenes into the necessary callback mess. Then you only suspend the minimal needed state onto the heap instead of having a full blown thread stack per operation, and you can get Node style scalability with better-than-Node style speed.
However lots of people don't know about these options. Hence "epic battles".