In my experience, interfacing native code via C++/CLI has negligible overhead, unless arguments are big and complex data types, which have to be converted to .NET types.
Otherwise, unsafe regions have practically zero overhead, and they are close enough to the metal.
Otherwise, unsafe regions have practically zero overhead, and they are close enough to the metal.