Now, while Go is designed mostly for you to not care about goroutines, there are some corner cases where one must know if a resource is used by anything, such as the chase of when you wish to close a file handle.
However, I'd argue that this is not related to go's concurrency model and the presence of background tasks at all. It's related to object lifetimes. This should be made clear at API surfaces.
A language solution to this would be Rust's lifetimes, not a new concurrency model.
Rust is renowned for being a total headache with borrowing and lifetimes. Nurseries might be a simpler solution for this.
As you say, a corner case. But a common one...
For example, if we take the problem of an os.File, some library might store the reference, and use it unexpectedly in a later function call after you called Close. This presents the exact same issue as a goroutine holding it.
(I honestly have no other examples of this issue than files/connections being closed prematurely for Go.)
In practice you'd probably have one goroutine manage the resource and its lifespan then other code would communicate with that goroutine using channels.
However, having coded Go for quite a few years by now, I haven't found it to be an issue at all.
Unless they are documented informally or encoded formally.