Maybe with kotlin coroutines you can rewrite the application partially.
Is there a difference between that and fibers?
That's not necesserily a deal breaker, but that's the difference.
For Java there is Quasar lib, which introduces async/await through bytecode instrumentation. It's by the same authors who work on the project Loom currently.
I don't use it because: a) the project web site feels a bit abandoned; I guess they concentrate on Loom now 2) I need analogues of wait/notify, sychronized, etc which are used in this code and not provided by Quasar; Quasar only provides lower-level primitives. One either need to implement such constructs on top of Quasar, or reimplement the logic. So it's not a drop-in replacement.
The project Loom aims to be mostly a drop-in, in particular fibers will support synchronized, wait/notify, etc.