Есть мнение, что как раз семантично и правильно делать это через тег i
Ранее, до html5 этот тег был просто презентационным и использовался для italic текста, но позднее был переопределен под любой текст, написанный отличительным манером от основного текста. Вот что говорит mdn:
The HTML Element represents a range of text that is set off from the normal text for some reason, for example, technical terms, foreign language phrases, or fictional character
Fictional character это как раз наш вариант с иконками.