Ideally spend from taproot addresses and send to native segwit addresses, but in reality just use either native segwit or taproot, which ever you prefer, since the difference is very small.
In the best case, we would only have taproot-to-taproot transactions, and nothing else. Because Taproot can handle both spend-by-key and spend-by-script.
But of course, if you think about fees, then Segwit output is cheaper to create, but more expensive to spent. Which means, if you spend from Taproot into Segwit, it is the cheapest option, but in the long-term, it is more expensive, because your recipient will pay that price. So, in the perfect case, taproot-to-taproot produces the least amount of on-chain bytes, if you spend-by-key, and not by TapScript (well, technically, spending by TapScript could be cheaper, but then it will be unsafe, if you make it spendable without any signatures).
So, to sum up: using Taproot and spending by key, is the easiest case to compress, even if it is not the cheapest, if you count your fees.
Therefore you are kind of obligated to use specific UTXO sizes.
The perfect choice is a huge multisig, hidden in a single Taproot address. Then, you can have for example 1000-of-1000 multisig, and then if there is 10 BTC on such address, then you don't know if everyone owns 0.01 BTC, or how exactly this amount is splitted between all participants. But still, this is the song of the future, for now, we have widely deployed 2-of-2 multisigs, and not much more than that. But of course, more things are possible, even if we are not there yet.