Hi Alex,
Great questions as usual.
renderUI itself actually does not create a div, it's the uiOutput/htmlOutput that creates it. You can replace uiOutput/htmlOutput with something like these examples:
tags$h4(id='foo', class='shiny-html-output')
tags$span(id='bar', class='shiny-html-output')
It would be great though to add a "tag" parameter to uiOutput and htmlOutput so you don't need to know this secret incantation.
Also, the framework has no special expectation that renderUI generates UI. It's uiOutput/htmlOutput (and the class="shiny-html-output" that they both generate) that tells Shiny that there might be UI. There's no harm at all in not having UI in these outputs though.