~
I think the main issue is actually not technical difficulty but compatibility and UX. even if a single seed can actually derive addresses across legacy SegWit and Taproot, wallets still need clear derivation paths and stuffs like gap limit handling for each script type.
So literally supporting everything in one wallet can also make recovery less predictable across different wallet software. Because of that some developers just choose separate wallets because it is simpler that is part of the reasons why some wallet still don't support some of them.
I don't see a problem with a wallet unifying address types into a single wallet (same wallet.dat or electrum default_wallet and etc) the derivation paths are already defined, each in its own BIP:
BIP44 handles legacy addresses, which occupy the hdkeypath=m/44h/0h/0h
BIP49 nested segwit addresses hdkeypath=m/49h/0h/0h
BIP84 native segwit bc1q hdkeypath=m/84h/0h/0h
BIP86 bech32m taproot bc1qp hdkeypath=m/86h/0h/0h
Basically, all wallets that support these address types use the derivation path above, which is the standard. In the past, some wallets used different derivation paths based on BIP32, such as m/0h or m/0h/0, but today almost all known wallets use the derivation paths above, from BIP44 to BIP86.
Regarding the gap limit, Electrum, for instance, scans 20 initial addresses and then another 20 and so on... while Bitcoin Core's default gap limit is 999 (or 1000 if we count from index=0). Bitcoin Core already has the features the OP mentioned, as well as Coinomi, Mycelium, and Wasabi (native segwit and segwit Taproot). These wallets mix scripts, unify balances and work very well that way. I think most of them have the
privacy guard feature.
I think most wallets don't bother implementing this because there isn't enough demand.
Edit: I for example, just checked the size of a Bitcoin Core wallet.dat file with
16 descriptors 08 descriptors in total (2 for each script type, 1 for receive and another for change), and the file is only 28.0 KiB. That means each descriptor in Bitcoin Core by default generates a batch of 1000 addresses for each script (this can be changed).
Correction: it's only 08 descriptors
there are only 16 desc if the user has already created a wallet.dat without encrypting it beforehand. Bitcoin Core generates 08 more descriptors and sets them as active after the user encrypts wallet.dat. This is a security measure.
28.0 KiB is even smaller than a low-resolution photo, practically an insignificant amount of disk space compared to downloading a full or pruned node.