I would push back on the "shared state with locks vs isolated state with message passing" framing. Both approaches model concurrency as execution that needs coordination. Switching from locks to mailboxes changes the syntax of failure, not the structure. A mailbox is still a shared mutable queue between sender and receiver, and actors still deadlock through circular messages.
Process-Based Concurrency: Why Beam and OTP Keep Being Right
https://variantsystems.io/blog/beam-otp-process-concurrency