I haven't heard anything about document.write() decreasing browser performance (could be wrong) but that's irrelevant because you are right in avoiding it's use because it is most definitely "bad form." It only works with webpages if you use it on the page load; if you use it during runtime, it will replace your entire document with the input. And if you're going for strict xhtml structure it isn't valid code.
I also haven't heard anything about phasing out element.innerHTML. It is crucial to the majority of current scripts that deal with html content manipulation. However, again, if you're adhering to strict xhtml standards, then it would be better to create elements using document.createElement and element.appendChild (and other native DOM node manipulation functions). For inserting text into an existing element, it's definitely still acceptable code (and completely cross-browser), but keeping with our xhtml motif, it would be even better to use document.createTextNode - especially when working with Mozilla Selections and Ranges.
I'll write up some sample code that's 100% xhtml compliant in a bit.
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
var doc_body = document.getElementsByTagName("body");
var article_header = document.createElement("h1");
var article_body = document.createElement("p");
article_body.appendChild(document.createTextNode("I have so much to tell you about this topic I don\'t know where to begin..."));
to_element.addEventListener ? to_element.addEventListener(event,handler,false) : to_element.attachEvent("on"+event,handler);