Kotlin Coroutines and Flow are our first choice for asynchronous and non-blocking programming. In the past we used RxJava a lot but nowadays our vision is to have asynchronous code written only with Kotlin Coroutines.
Structured concurrency benefits us a lot - we don't need to worry anymore about manual resources clearance at appropriate particular component lifecycle moment. This helps us to avoid many potential bugs.
Suspending behaviour greatly contributes to efficient system resources management and therefore better performance, reduces chances of multithreading related hazards.
Last but not least, coroutines allows us to write relatively simple, efficient and idiomatic asynchronous code in Kotlin, without using any third-party solutions with steep learning curve.