Well, it would be a bit silly to have to export it to an html file and then read the result back in just to parse out the headline numbers. What you can do instead is call the functions that parse the buffer and use that information to add the tags.
I don't know the org source code very well, but it's usually pretty easy to get started with these things. I first double checked the manual to see how you actually start an html export (I don't export my org mode files, so I couldn't remember). As usual, the manual gives both the key sequence and the function name, so I started by looking at the help for this function:
C-h f org-html-export-to-html. This help buffer includes a link to the source code, so I followed it. This function calls
org-export-to-file, which is longer, so I just skimmed it. After setting some variables and checking some conditions, it calls
org-export-as. Several steps later I found
org-export-collect-tree-properties. This appears to be the function you want; it can collect the headline numbers for you; if the second argument is
'(:headline-numbering) it'll return exactly that.
Of course it doesn't operate on the buffer directly, it looks like you have to first parse the buffer with
org-element-parse-buffer first; this examines the current buffer and parses it to build an AST.
Once you've called
org-export-collect-tree-properties you'll have an alist mapping headlines to headline-numbers and can go to each headline and add/remove tags as needed.
That's about as far as I can go at so late an hour, but it should be enough to get you started.
As for using numbered headlines from the get-go, the problem then becomes one of renumbering everything whenever you move nodes around. Using unordered symbols such as asterisks eliminates that headache.