WordPress renders menus through wp_nav_menu and Walker_Nav_Menu, which emit markup as a side effect of walking the tree. Changing that markup means subclassing the walker and overriding string concatenation, which is why so many enterprise themes carry a walker class nobody wants to modify.
Log1x/Navi builds the same menu into a structured array instead: items, children, classes, active states. The theme renders that as components. Structure and markup are separated, so adding an icon field or an ARIA attribute is a change to a component, not a rewrite of the renderer. It is an open source Composer package, and it is what this site runs on.