We didn't actually use the framework provided by github.com/facebook/react-native/blob/4454fdc219a… and just directly bind to JavaScript through JavaScriptCore's C API. Most of our GL binding code lives at github.com/expo/expo/blob/98ab9ef6a35c6d248976480…. The initialization of that is done by an Obj-C native module at github.com/expo/expo/blob/98ab9ef6a35c6d248976480…. The build process for iOS involves just adding the .cpp files as usual in Xcode (in our case we have it as a subpod), and for Android you will need to use JNI as in github.com/expo/expo/blob/98ab9ef6a35c6d248976480… and bound with github.com/expo/expo/blob/98ab9ef6a35c6d248976480… accessed from github.com/expo/expo/blob/98ab9ef6a35c6d248976480….
In terms of 'difficulty' -- it's hard to quantize since that's relative, but I would say that in the grand scheme of things the build system isn't the most difficult part, if only less defined and less documented. Actually writing the binding code is the most important bit, and is about linear in the complexity of API you want to bind. In the cpp/ directory we have some other utilities we've used in the binding.
In terms of 'recommendation' -- that's a hard judgement to make in the abstract, but concretely given a particular use case, yes it could make sense, if that is the main and only way to achieve the result you want. I would say try using the 'CxxModule' system as provided by React Native (you'll have to watch for including the headers and linking with React Native's code properly) -- we didn't do this, so have no examples to point to there. The way we did it (direct JSC C bindings) means you know exactly what's going on under the hood, which could also be what you want.