You can use both languages in one project, so I'd recommend trying GDScript at first. It's a very simple language so it can be picked up quickly, but as soon as you feel yourself reaching for LINQ or wanting a proper type system then switch that script to C#.
The engine code is great. It's structured logically and navigating it is intuitive. Building the engine is simple, customisable, and documented well. Significant chunks of the engine are integrated as compiled in 'modules'. You can add your own modules and the build system lets you select which modules to include. Adding new node types and working with the scripting/binding system is pretty straight-forward.
I think the documentation for working on the engine[0] and contributing to the project[1] (as well as the code itself) are areas where Godot is doing exceptionally well.
GDNative can be used to integrate external libraries, add support for other languages[2], without compiling the engine. You can use it as a scripting layer, add node types, etc. I haven't used GDNative non-trivially.
* [0] https://docs.godotengine.org/en/stable/development/cpp/index...
* [1] https://docs.godotengine.org/en/stable/community/contributin...
Text from Godot home page:
"Use the right language for the job:
Keep your code modular with an object-oriented API using Godot's own GDScript, C#, C++, or bring your own using GDNative."
But my memory was that last time I tried about a year ago, something was patchy about c++ documentation.
My doubt still is if c++ is a first class citizen in Godot at par with GDScript and c#.
It's really nice to be able to just create some game object, then immediately take advantage of anything else I need to do on the c# side.. whether it be some basic classes for player objects, helpful static data structures etc.