2) I use quite a few plugins containing native code. Older versions of react-native didn't handle this well, which required manually setting up linking for Android and iOS. This was painful. Thankfully, they added the "react-native link" command, which started doing this automatically. Since then, I haven't had any issues.
3) Upgrades from early version were also painful. I gave up the first time I tried, since the benefits didn't seem to outweigh the time it took to upgrade. Once they improved the upgrade process, I bit the bullet and upgraded. Since then, upgrades have worked flawlessly, so I've upgraded whenever they released features that replaced third-party libraries.
4) I develop on a Mac, and I release the application on both Android and iOS. Only one component differs between the two platforms: the header. I show a "Back" button on iOS, whereas I disable it on Android since it's unnecessary.
Early on, I also found some discrepancies in styling. Text boxes, for instance, showed default fonts on Android, while they showed my custom fonts on iOS. They also included underlines, and tapping outside buttons with a visible keyboard required tapping twice. These turned out to be bugs, and I was able to hack around them pretty easily. I believe they have since been fixed.
React Native definitely lacks a good charting solution, or at least it did when I wrote one. I haven't checked since then, since my custom solution solved my needs. It ended up working out well, since I was able to reuse my charting library to generate SVG-based charts for the web dashboard. If detailed charting is a requirement for an application, it will require some effort to get working on React Native, but it's not an insurmountable task.
Overall, React Native definitely had some rough edges when I first released the app, but they have fixed all of the issues that annoyed me. It has improved significantly, and if I were to build another application, I would use it again.