Virtual fields are great, but sometimes I think we get carried away with their usage within QGIS. (don't worry, im guilty too).
From a high level DB engineering perspective, ideally, calculated fields should occur either on database transactions when editing, or produce view tables, thus enabling the user to consume the view table instead. View tables would be suitable candidate replacements for virtual fields.
postGIS would be ideal, but you have mentioned your use of Geopackages. Geopackages are in essence a Sqlite database. Looks like some other users have attempted similar view table structures - see here Create view table with QGIS and Geopackage
(BTW, that link doesn't actually have a solution, it just seems to show that others have tried and that there are some limitations).
Implementing code in QGIS to trigger events may be ok, but this will tie the virtual field creation to the QGIS application itself. This may or may not meet your publishing needs - for example, if its just yourself or other QGIS users, then that is probably ok - but if you are wanting this dynamic capability in - say a web mapping application, then the QGIS solution is not abstract and dynamic.