Any of them is likely to be more than fast enough. If you are one of the few who needs to wring every last percentage point of performance out, then you would probably already know the answer to your question. 😉 Dev wise, I think coroutines are a big step up for writing nonblocking code. Managing async code purely with callbacks or promises or a big state machine is certainly doable, but not pleasant.