I definitely think that for a cross platform app, going all out with something like Cordova or React Native isn't particularly smart.
Sooner or later, you are going to reach a point where you need to use a feature of the underlying OS which your abstraction layer doesn't support well (or at all) and will end up having to make a horrible compromise.
Also, apps build with these frameworks usually don't look or feel native, I can generally tell that I'm using something built with Javascript (not always, sometimes the developers nail it, but a lot of the time).
However I feel that developing completely separate native versions of the same app with zero overlap in code isn't smart either.
It's definitely good to find a middle ground.
I personally like Xamarin. Xamarin.Android and Xamarin.iOS get you as close to native as you can get, while still allowing you to share a fair amount of code between the platforms.
I'm using this approach on a project at the moment and it's working well.
I would love to try Basecamps approach here on a project, it seems very smart.