1 is very expensive to maintain.
I would advise evaluating either 2 or 3 depending upon your use case and level of comfortability with Python/C++. Btw, many people find the trame approach attractive because it allows building a scalable app and offers flexibility in switching between remote (server-side) or local (client-side) rendering.