In my opinion it's mostly a pattern where you make sure that all sub-tasks are fully contained within child tasks and never outlive them. You can model that patten in most programming languages - e.g. as you do in JS.
However there can be environments which have structured concurrency baked in and thereby enforce the pattern. Kotlin coroutines are one example here.