In Vanilla JavaScript Components I have a section called "What about a template/view/UI?"
You just use right tool for the right job.
Do you need to create span with textContent and append it? Use createElement.NEVER use innerHTML, use only textContent.
Do you need to insert many elements at once? Use documentFragment;
Do you need to insert same small HTML widget/component like post box or product card many times? Use <template> . Moreover, you can insert your data from JSON into templates with basic string replace or a bit of a custom parser. Here I have a proposal for native variables for <template> and a polyfill.
I use <template> all the time for all components bigger than just one, two tags. For example, I use it with my DataTable. I don't need to write any custom JS at all anymore. Just almost empty <table> and I define row in <template>. I NEVER had any performance issues with Vanilla JS and <template> what I can not say about jQuery DataTables, those fancy frameworks with JSX/TS/whatever overcomplicated garbage.
Finally, just create a UI object or add UI methods/logic into same object if you have a very basic component and if in the future you would like to change your CommentUI.create() implementation, for example to replace createElement with <template> or just use handlebars, whatever, you might do so easily without changing anything else in your architecture. Let the UI layer handle it for you. Main component's object should NOT be coupled to either UI/view layer nor Model/API/JSON layer.
You can read my article on Medium to see also code samples of a basic Like button component using nothing but a few lines of Vanilla JS.
Last note about performance. You could ask this question 5+ years ago, today all browsers will handle optimization even when you do not use documentFragment on their own. (However, last time I played with huge lists in Firefox, I have found that there is a very big difference between appending element at the end of a huge list and before the last element, I am not sure if there is still same bug/issue). Anyway for a modern browsers and devices even for heavy DOM operations, there is almost no difference in a real world scenario.