The key advantage of coroutines is that they let you avoid callback hell. For example, you can replace deeply nested flatmaps with a simple and easy-to-understand imperative-style "do this, do that" code. If you don't have any of that and all your Rx code is just "take this IO result, switch to UI thread, display it" or "take this button click, then do some IO", then you will not find much difference between Rx and coroutines.