It isn't. It's perfectly fine to write blocking code if that is what your use case requires.
In reality, if you've got an entire async-based web framework, as it looks like Poem is, then you won't realistically be able to just convert it to blocking, because the major pieces will likely be async all the way down. You will not be able to have its async-dependent parts run without an async runtime.
That said, you can wait for the result of individualasync operations using futures::block_on().