Because move_and_return will only work with Box<u32>, and not Rc<u32> or Arc<u32> or Cow<u32> or any other kind of container. Borrows separate access from storage: it doesn't matter where or how a value is stored, you can still pass a borrow around.
You can't always move. Imagine a tree. If you wanted to perform every operation on the tree by moving, then you'd always need to pass ownership of the entire tree even if an operation only needed the leaves. That's obviously not feasible.
If for example the tree has unbounded fanout, then you'd always have to rebuild every internal node from scratch each time.
Constant-time popping from a Vec would also be completely impossible. You'd have to turn the Vec into a by-value iterator and re-collect every element but the last one, every single time you needed to pop the last element. Utterly inefficient and roundabout.