And even if you don't care about CoinJoin, not broadcasting the transaction as soon as the inputs are signed adds implementation complexity (should you retry if payment_url is unavailable? how many times?

I guess a lot of wallets just won't broadcast at all and try to submit via the URL. If they don't succeed, then the transaction is just never committed to the wallet. Doesn't seem like a big deal. Payment submission is online, interactive. If it fails, you keep the coins. This seems simple and straightforward.

If someone really wanted to do a real-time coinjoin, they can build the transaction together and submit it via payment_url, and broadcast as well. If the merchant has an issue with the payment for some reason (e.g. request is expired or the tx is non-standard), well, you'll have to sort it out with them manually.