Navigation is a skeleton of the app, so you need to pay much attention to it in order to have a good performance.

JS based navigation: There's a limit to how well you can fake navigation with pure JS and small details like side swipe for back get lost, tab navigation, push/pop etc.. Also consider what happens if Apple decides to revamp the design of the navigation bar like they did between iOS 6 and 7. Will we really go to the length of providing two separate experiences for different OS versions with the pure JS implementation? JS based solution is also bad for performance. Navigating between one screen to another may update third screen for no reason if you design a little bit wrong structure.

Native Navigation: As in the web react-native uses one root view by default (RCTRootView on iOS and View on Android) from which view hierarchy of the react-native application starts. But with native navigation system every screen uses separate Root view. This means that instead of a single RCTRootView, app will have several ones running in parallel. Running screens in parallel gives us better performance. Additionally, native navigation approach is much more conservative in terms of memory usage compared to JS based navigation.