https://github.com/harbaum/I2C-Tiny-USB
works reliably but not very fast
The I2C-tiny has worked pretty well for me.
Perhaps not the best suited for your specific application, but one big advantage at least for me is that there is Linux kernel module for it which creates a new bus in the kernel I2C subsystem.
This means that you can leverage existing kernel modules for I2C devices instead of having to write your own.
E.g. if you connect say an LM45 sensor to the I2C-tiny, it will be natively recognized in Linux and show up in lm_sensors and other monitoring utilities.
Even the bq27421 has a Linux driver, so you could connect it and it should show up as a battery.