Based on recent open-source benchmarks (https://github.com/chrisgleissner/loom-webflux-benchmarks), virtual threads consistently achieved same or even better performance than Project Reactor. This indicates that if your main concern is simply overcoming performance bottlenecks related to thread overhead or blocking I/O, the answer is YES, virtual threads alone are often sufficient and provide a simpler programming model.
But, the reactive programming model brings benefits beyond reducing thread usage. Frameworks like Project Reactor are inherently event-driven, which provide strong support for:
The model itself—not just the performance—is a key advantage. A concrete example is the recent wave of AI chatbot applications, which must handle massive numbers of concurrent requests, integrate with third-party APIs during a conversation, and stream partial responses back to users in real time. With Reactor, this can be naturally implemented using Flux and Sinks, while with virtual threads you would need to manually manage event emission, which is less straightforward.