I still don't get why you can't remove vdevs from a pool. ZFS already knows where all stripes are, so it would be trivial to pull all of them off a vdev and distribute them among the rest provided there is remaining space. It already have algorithms for balancing striped data amongst unequal vdevs, just reverse it and move a few stripes around.
If that is not enough there should be a way so you could make a dataset restricting it to desired vdevs and transfer all data to that dataset, making removal of the empty vdev possible.
The devil is in the details. Theoretically, every operation imaginable involving disks is possible with ZFS - however, some operations were never written (in no implementation of ZFS). Since ZFS was always meant for sysadmins in large, money-is-no-object corporate settings, little importance was given to convenience features.
The original decision must've been something like this:
Option A: Removing a vdev by copying everything it contains over to the remaining vdevs and doing the required housekeeping takes X amount of time.
Option B: Destroying the pool, creating a new one and restoring everything from backup takes Y amount of time.
X is greater than Y (in the general, worst-case scenario) and involves a risk of some weird bug corrupting data. Resources saved by not implementing the vdev removal function can be transferred toward stabilizing the backup/restore features, further improving option B.
Bottom line: Option A is not to be implemented.