Olá Saraiva,
Eu não tenho experiência com o node-ffi, mas tenho bastante experiência com add-ons em C++. O tradeoff básico é que o node-ffi permite que você invoque as funções sem nenhum código boilerplate, mas com muito menos performance. Os add-ons oferecem ótima performance, mas te obrigam a escrever boilerplate para conectar o JS ao seu C++.
No geral, não tive nenhum problema em integrar Node com C++. Tudo funciona lindamente: a libuv, o V8, e as chamadas de função do JS para o C++. Para compartilhar dados, basta alocar via V8 no seu C++ e boas. Para te dar uma idéia da forma da solução, alguns exemplos de código:
1. Inicialização do add-on, basicamente expões uma "classe" de JS chamada Index para o JS, cujo protótipo tem duas funções ("open" e "suggest"):
void v8Index::initModule(Handle<Object> exports, Handle<Object> module)
{
Isolate* isolate = Isolate::GetCurrent();
// Prepare constructor template
Local<FunctionTemplate> tpl = FunctionTemplate::New(isolate, constructor);
tpl->SetClassName(String::NewFromUtf8(isolate, "Index"));
tpl->InstanceTemplate()->SetInternalFieldCount(1);
// Prototype
NODE_SET_PROTOTYPE_METHOD(tpl, "suggest", suggest);
NODE_SET_PROTOTYPE_METHOD(tpl, "open", open);
constructorHandle.Reset(isolate, tpl->GetFunction());
NODE_SET_METHOD(exports, "loadIndex", loadIndex);
}
2. Aqui está a definição dessa função "suggest", para que você tenha uma idéia do que involve: