In my opinion, in such cases a fork is made and a new repository is maintained, classes are being finalized to become a library, isolated from strong links with the project . Thus we get a full-fledged library in the piggy bank.
Of course, you need to do this if it is cheap to do otherwise, you should use the tag - but in large repositories, you can litter the repository itself and lose the tag when you clean up the old tags. The same with the branches. If the development goes through git flow, then there will be only 2 permanent branches, the rest will be demolished after the implementation of features.
ps In the gita, you need to get used to the fact that the tags are lightweight, the branches are lightweight, that you do not need to be afraid of merge and you do not need to be afraid of forks. Repository management systems like github, gitlab, bitbucket are designed for all this, including forks