Most the answers already given are very misguided. Reactive programming isn't just about efficient sharing of execution threads. We already had threadpools and ExecutorServices in Java.
What reactive frameworks bring to the table is backpressure propagation. With backpressure handling super fast producers churning gigabytes of data per second will not drown slow consumers. There is absolutely nothing that virtual threads change about this.
Reactive programming is not and will not be made obsolete by virtual threads. These are orthogonal concepts and they may work together. Threads used by a reactive stream may very well be virtual.
As a matter of fact, Project Reactor 3.6.0 officially added support for Project Loom (virtual threads).