I also have a temporary fix that works well for me (I didn't want to include a header in every tab, I really wanted to have a title instead).
The first line in the server tells the first tab to be selected, and I'm adding a CSS that makes the ghost tab not appear. WATCH OUT because if you use this hack and the problem is fixed in a later shiny version, you will have to remember to remove the css hack, or else your first real tab will not appear.
runApp(list(
ui = navbarPage(
"Title",
id = "page-nav",
tags$head(tags$style(HTML(
"#page-nav > li:first-child { display: none; }"
))),
tabPanel(title = "First", "hello"),
tabPanel(title = "Second", "world")
),
server = function(input, output, session) {
updateTabsetPanel(session, "page-nav", "First")
}
))