The discussion and tag slugs are handled in very different ways.
The discussion slugs have less constraints, because they aren't actually used as identifiers. The discussion ID is used in the URL, and the slug is just for cosmetic/SEO and can change when the discussion is renamed. The slug must be generated automatically and a same discussion title should always result in the same slug. For this reason this slug is generated using Laravel's Str::slug()
method server-side.
The tag slug however is the unique identifier of a tag in a URL. It must be unique across the forum and should not automatically change if the tag is renamed as to not break existing permalinks. It's expected the forum admin will configure it to an appropriate value, using the dedicated input field. A very simple client-side javascript code pre-fills the slug field with a slugified version of the title for convenience.
That extremely simple javascript code could be improved, but that would be at the cost of increasing Flarum's javascript bundle. Calling a server-side endpoint to compute the slug with the forum's active language could be an option, but that seems a bit overkill for this feature. Yet another option would be for the tags extension to asynchronously load a more complete slugger javascript library when the edit tag modal is open.