I can't answer your deeper query about the best way to model your system, but I would just like to point out that the general external interface as documented in the original 2018 app note was given a big update by another developer some years ago, but the documentation of that extension was never completed and published. The publication of the updated app note was delayed because we never got around to crafting C++ examples using the updated capabilities the way we had generated examples for the simpler case, and then I retired before finishing the documentation. However, I believe that the updated version of genext (which will require you to write some extra code) is precisely what you could use here.
The big update is that there is now a capability to write external device codes that support "voltage limiting." The details of how voltage limiting works are in the Xyce Mathematical Formulation document, but it is exactly what is used in models such as the diode and bjt precisely because of the exponential terms in them. I suspect that this technique is necessary for some of the types of devices you want to implement.
By using the "N_DEV_VectorComputeInterfaceWithLimiting.h" header instead of N_DEV_VectorComputeInterface.h" and implementing a somewhat augmented set of vector compute functions, you can detect that voltages have changed too much for your device to converge properly, and then compute the contributions of the device to a smaller change instead. When you do this, you have to signal back to Xyce what you have done through additional vectors (very roughly speaking, you're returning an additional vector of the device Jacobian times the difference between the solution values you were given and the solution values you actually used).
This is a standard SPICE trick, and was one of the things mentioned in the original GENEXT app note as something that had not yet been implemented at the time the original document was written. It is unfortunate that we never finished writing it up after it got done. The only things missing from the updated write up were actual usage examples, all the interface documentation and math documentation was completed.
Xyce team: That incomplete document was still in the [non-public] Xyce_Docs repo when I left. It'd be great to get it wrapped up and published, all it's missing is some example code. A basic diode example would do (simpler than the one done in the Py-Mi regression test directory, which unfortunately includes some code (most of it commented out) that duplicates older versions of the Xyce diode that were removed in 2022 and makes it a little hard to follow and not suitable as a documentation tool).
At the moment, the only examples that use the vector compute interface with limiting are those associated with the Py-Mi project (a python-based capability that uses GENEXT). Those examples are in the Xyce_Regression/Netlists/GenCoupAPI/models directory. Py-Mi itself is documented in its own application note, but unfortunately I can't find it on the Xyce documentation page. That should get fixed. With a little digging, I found a copy here:
https://www.osti.gov/biblio/1813650/. Sadly, it doesn't document the voltage limiting extensions, either.