It's great that finally there is an article on that.
I think, that using snapshots instead of persisting delivered messages inside journal is that, when you're saving a snapshot, you don't wait for ACK from snapshot store. This causes the following problem: imagine that you have snapshoted last state of deliveries and immediately after that an actor crashes. It gets reincarnated and starts recovery procedure. Problems is that actor restart is way faster than most of the snapshot saving, so when trying to recover it may turn out that it won't recover from the latest snapshot (because it was not stored yet), having invalid state in result. That why snapshotting should never be used alone, only as optimization for journaling messages.
What I'm missing, is dedupe pattern. We can detect duplicates (not allways but to some extent) using things like ring buffer for received delivery messages. Combined with AroundReceive we may filter them, before they come into receive methods.