It was only slightly slower. (Netty vs virtual threads) that could easily just come down to implementation differences.
The take away, IMO, is that without major architecture you can use blocking code and get near (and sometimes over) the same performance as you'd get with non-blocking code.
> I also wonder if the reactive libraries could be refactored to use the virtual threading model.
You could, but ultimately the question is "why?". One of the benefits of virtual threads is that the reactive model isn't as appealing.
That said, it's definitely possible for the reactive libraries to simply use virtual threads whenever they do anything in parallel. That'd allow the model to avoid potential issues when calling into blocking code.
There might be a better avenue in the future if the JDK devs expose the underlying coroutine API (or parts of it) that powers virtual threads today.
> I would be sad to see those libraries go by the wayside as they do make a lot of complicated tasks simpler once you understand it.
The benefit of virtual threads is making things even simpler so you don't need to understand those complicated constructs. You just spawn new threads whenever you need to run things in parallel.