There might be a bit of a confusion over here. BIP30 is only active at a specific block (1983702) and beyond (and pre-BIP34 other than the two blocks) due to the possibility of reintroducing collisions in TXIDs with the pre-BIP34 coinbase.
BIP30 is expensive because it involves searching each of the transaction id and checking if they have a colliding TXID within the UTXO set.
if (fEnforceBIP30) {
BOOST_FOREACH(const CTransaction& tx, block.vtx) {
const CCoins* coins = view.AccessCoins(tx.GetHash());
if (coins && !coins->IsPruned())
return state.DoS(100, error("ConnectBlock(): tried to overwrite transaction"),
REJECT_INVALID, "bad-txns-BIP30");
}
}
BIP34 simplifies this by ensuring block height in the coinbase and thereby making the TXIDs of coinbase tx unique. However, certain blocks pre-BIP34 has numbers in the scriptsig that coincides with block heights in the future which results in a small number of post-BIP34 blocks being able include the same coinbase again. IIRC there's one at height 1983702, and more after so that's why we enforce BIP30 again after 1983702.
Anyways, TXID collision can cause a problem and a consensus fork in a very specific scenario. Anyhow, it is not a big issue because of how unlikely TXID collisions are.
tl;dr: You're right that BIP30 is not required after BIP34's activation and that BIP30 will only be active again far in the future. We deactivated BIP30 in favour of BIP34 because it is unnecessary. BIP30 gets reactivated because of the possibility of a TXID collision in the coinbase again in the far future. However, enforcing it again would necessitate the client to waste resources on the unlikely scenario of SHA256 collision.