Eric,
BitPay clearly do understand the risks of 0-conf. In case you were not aware BitPay does not particularly "accept zero confirm transactions". When a payment is seen on the network the payment screen reports the invoice has been paid, but that's front-end user facing. On the back end it's marked as paid but the API exposes the the confirmation status allowing the merchant to make business decisions about when to progress to fulfilment. A good example of this is Neteller (a sort of paypal variant) which allows one to fund the account with fiat using Bitcoin, via Bitpay. When you pay the bitpay invoice, your account is marked as payment pending until there are some confirmations.
Coinbase does not expose the confirmation status and from what I understand (not checked myself) they guarantee payment to merchants for 0-confirm, regardless of whether they confirm or not.
I want to address something stated by Justus, that signing a payment message and broadcasting somehow solidifies intent and going back on that would be fraud. This seriously conflates cryptographic certainty with human behaviour. For one, humans make mistakes all the time. We get tired, we get distracted, we make copy paste errors. It's entirely possible on sends a payment only to find it's been sent to the wrong address or the wrong amount has been sent or the fee is wrong. Software may also misbehave (Electrum for example has a weird UI glitch with fees where the specified fee can be overwritten). r/bitcoin it littered with sad examples. What ECDSA signing tells is that it was signed by your private key, but nothing else. It does not say if *you* signed it, or that the message you signed was correct.