I have used gdscript/gdnative/native-module. I've used C# with unity. I will say this, C++ has lower 'portability' issues than C# because it is in essence the game's binary. If the game is running on a platform, C++ will. You get all the power and annoyance of C++ and all the choice of IDE for it. If you use C# you are still dealing with the godot engine which is implemented in C++.
I ended up preferring the module route over gd-native in my case.
One down side of C++ modules is the lack of documentation binding as a GDScript class. I resorted to the game's own code as a reference. GDNative and C++ differ slightly defining methods, properties etc, but you can use the gd-native tutorials to get up and running and building the engine.
If you have speed dependent functionality which can be substantially developed and tested independent of a game engine, I'd simply implement it in C++, pound out bugs and design there and then bind it in Godot as a module.
It helps massively to have a good C++ IDE to search the engine's files to overcome the lack of documentation.