After shipping more than ten React Native apps, the honest answer to "CLI or Expo?" is: it depends on how much the app needs to touch native code, not on which one is objectively "better."
Expo wins when the app is mostly UI, API calls, and standard modules — camera, notifications,
in-app purchases through expo-in-app-purchases. EAS Build removes the pain of managing Xcode and
Android Studio locally, and OTA updates via EAS Update ship fixes without an App Store review.
Bare React Native CLI wins the moment I need a custom native module, a third-party SDK without an Expo config plugin, or fine-grained control over build settings — which was the case for MetalFolio's live price widgets and background refresh.
My rule of thumb: start every new app on Expo. Eject — or rather, start bare — the moment a native dependency doesn't have a clean Expo config plugin.