I think the contract in the context package is that WithCancel may leak resources if cancel is not called and the parent context is cancelable but never canceled. At least, that seems to be the behavior I see in the implementation here:
https://github.com/golang/go/blob/master/src/context/context...
So in this case, errgroup probably doesn't have a choice and needs to call cancel() at some point.