Not really IMO, since ON CONFLICT offers strong guarantees about insert-or-update outcome (relevant in READ COMMITTED). The downside is that the syntax is constrained in order to do that job well. MERGE is a way of "combining statements" - offers no special concurrency guarantee.
Pretty much. *Any* unique violation could trivially violate snapshot consistency (at least in RC). In general you could easily get an error due to insert from an xact that wasn't visible to your own RC insert statement's snapshot, of course. "True upsert" is intrinsically messy.
It's no coincidence that statement is structured as INSERT ... ON CONFLICT DO UPDATE, rather than UPDATE ... WHEN MISSING DO INSERT. Needs an "arbiter constraint" (or unique index) to referee who conflicts with whom very precisely.