Project Reactor would let you block for the completion of a reactive stream:
By doing this, you'll have the R2DBC driver executing tasks on a pool of background threads, while another thread is just blocked for completion. Compared to just using a synchronous API, this approach would be wasteful in terms of thread allocation. With a synchronous API, like JDBC, you'd have just one thread blocked, without having the additional background threads that execute the task to completion.
But thinking ahead, Project Loom will make threads very cheap in Java. There should be no concern about blocking a virtual thread, as virtual threads won't be a limited resource. With Loom, I think a model in which both synchronous and reactive styles are used could be reasonable. Those who prefer the reactive style of programming can consume a reactive stream as we do today: Using functional style operators of a reactive streams library (like Reactor). And those who prefer a synchronous style can block for the completion of a reactive stream, consuming the result as if it had been returned from a synchronous method call.