Calling C function pointers is currently not supported, however you can declare Go variables which hold C function pointers and pass them back and forth between Go and C. C code may call function pointers received from Go.
There will always be overhead for cgo calls. This is because of the fundamental difference between how call stacks are handled.
Hard to say which would be better. I would start by seeing if I could get the go tool to build the entire app. In effect, having go.main do nothing other than calling c++.main. This is a bit more than option a, but would allow the most flexibility for choosing which part of the app to convert (e.g., top down, bottom up, or some combination of the two).
Any progress on this? I’ve been trying to chew through a similar situation; Not sure if the best approach is wrapping a C++ lib with C so I could call that from go, use swig, or re-write in go. I’d love to share references.