It should be possible to recursively destroy Swift object graphs without using up stack space or changing observable behavior, by reclaiming the freed space from objects as context for tracking the rest of the object graph to release. There was a paper describing this technique recently:
We have some ideas for how to apply this technique to Swift, but we haven't gotten around to implementing them yet.