With the changes introduced in #3450, we only need to remove the pointer from a shape definition to a given shape immediately, and the rest of the cleanup can happen asynchronously in its own time.
This is one more step in the work being done to make cleaning up shapes as lower priority to the system as possible, not blocking anything on the critical read or write path.
See #3472 (comment) for argument by @magnetised