This is common in exchange protocols for example. Usually the counterparty has a time-locked transaction that can get into the blockchain after a certain time; you have up until that time to stop the tx from going through if that counterparty does not perform, and the way you do that is to double spend one of the inputs so that the held tx is invalid. This does not mean you have committed fraud; it simply means you have retained your money when the counterparty failed to perform.
It's not a double-spend unless the network sees both transactions. In those scenarios, the network only needs to see one of them. There is no need for the counter-party to publish their time-locked transaction before the lock has expired, and if you have spent one of its inputs before then, there's no point in them publishing it ever.
As a newbie, publishing a time-locked transaction before the lock has expired seems like bad practice to me. It's surely unreliable; and at best selfish and at worst a potential denial of service attack. Suppose the transaction is locked for six months. Why should the network remember your transaction for you for such a long time? It'd be more reliable to remember it yourself and then broadcast it when the network can accept it, when the lock has expired. The same argument applies to shorter periods.
My take-away from discussion in this thread is that broadcasting time-locked transactions early, in the situations you describe, is also morally wrong and dangerous. Whether a party gets paid should depend only on whether they fulfilled the real-world contract. It should not depend on transaction races or on block-chain re-organisations.
So I am agreeing with you that transactions with expiry times are similar to various kinds of double-spends, but my conclusion is not that expiry times are OK, but that those double-spends are not OK.
You get your 'stuck' zero-fee transaction out of limbo by killing it with a double spend that replaces it with a fee-paid transaction.
When the new transaction is the same as the old one but with a higher fee, the race condition is benign. The receiver doesn't care which transaction wins, because they get paid either way. A block-chain re-organisation is harmless to them. So that's fine.
The double-spends that are bad are the ones where different receivers get paid. Who gets paid should not depend on race conditions in the block-chain. It shouldn't depend on luck. That's always bad.