Traditional stackful symmetric coroutines can be used to implement call/cc, by starting a new coroutine with a given function and yielding a closure to it which returns to the current coroutine & call point. Similarly, you can implement coroutines in terms of call/cc.
So the two concepts are equally powerful, though in practice implementations may have different performance characteristics and implementing callcc with coroutines might leak resources in some languages, and common callcc use can be harder to track than common coroutine uses for compilation.
Structured concurrency-coroutines like in Trio & Kotlin are more limited since they work within a specific scope. You can’t do manupulations that pull in the entire call stack. This reminds me a lot of delimited continuations.
Is it possible to implement structured concurrency with delimited continuations, and/or delimited continuations with structured coroutines?