As others have pointed out, coroutines are cooperative, not preemptive.
As has also been pointed out, on Kotlin/JVM the threads that coroutines run on are preemptive, so the CPU will never be starved by coroutines. I’m not familiar enough with threading on Kotlin/JS or Kotlin/Native to say how they work.
I think the only time you need to worry about yielding a coroutine is if you are using a dispatcher with a limited number of threads in its thread pool, and you have scheduled more coroutines than there are threads on that dispatcher, and you can’t wait for the currently running coroutines to finish before you let the queued coroutines do at least some work. But that should be a rare case.