Pusher does not replace Expo push notifications. I repeat, Pusher- or Firebase subscriptions - or HubNub- or Socket.io***- or your home-grown web socket solution- does not replace Expo (or stock iOS or stock Android) push notifications.
As you scale, you probably want both of these things.
You need stock OS (or Expo, which just an abstraction for stock OS) push notifications to send notifications when your app is not open. If you want something to pop up on somebody’s lock screen when they get a new message, you need Expo push notifications, or you need to detach and use stock OS notifications or somebody else’s abstraction over the stock push notification API’s built by Apple and Google.
You probably want web sockets (via Pusher or whatever else) to automatically refresh data based on changes to data on your server when your app is open. You don’t want to force your user to refresh manually just to check if there are new messages in a chat feed. You want the messages to appear automatically. Web sockets let your app listen for changes from the server while the app is open. They do not work when the app is closed. Now, you can also listen to Expo push notifications when the app is open, so you could skate by listening for those and not using web sockets, but Expo/ OS push notifications are not guaranteed to be delivered and are generally slower than sockets, so it’s not ideal for triggering refresh when your app is open.
*** I haven’t checked exhaustively and each of these services might also have a push notification service that does abstract the OS-level push notification API (just like Expo), but their web socket solutions that you can call easily within a non-detached Expo project do not replace Expo push notifications.