Correct way to render a modules output through a template?
To be honest, aside from the use of extract() (which is obviously bad in and of itself), I think the code is perfectly valid, and respectful of Drupal's processes/conventions.
There are two different ways to pass variables to theme functions in Drupal 7, both provided as an argument to a theme definition in hook_theme(). They are variables and render element.
I can't possibly explain the difference between these two better than the hook_theme() docs:

Use 'render element' if you are theming a single element or element tree composed of elements, such as a form array, a page array, or a single checkbox element.
Use 'variables' if your theme implementation is intended to be called directly through theme() and has multiple arguments for the data and style; in this case, the variables not supplied by the calling function will be given default values and passed to the template or theme function.

In your case you're theming a render array, rather than calling theme() directly, so render element is the one to use.
When you use a #theme property on a render array, the entire element (in your case $block['content']) is passed through to the theme function/template file. The name of the variable that you have access to in the template file is the name you have given to render element in the hook_theme() definition.
So if your hook_theme() defines 'render element' =&gt; 'my_lovely_var', you'll have access to the render array as $my_lovely_var in the template file.
I suspect that the author of your code was just taking a small shortcut so he/she didn't have to access the $element array directly with code. Without the use of extract() the template file would/should have looked like this:
&lt;div class=&quot;content&quot;&gt;
  &lt;h1&gt;&lt;?php print $element['dataA'] ?&gt;&lt;/h1&gt;
  &lt;h1&gt;&lt;?php print $element['dataB'] ?&gt;&lt;/h1&gt;
  &lt;h1&gt;&lt;?php print $element['dataC'] ?&gt;&lt;/h1&gt;
&lt;/div&gt;

Just for posterity, this is the same code re-written to make use of variables instead:
The same code using variables would look like this:
// ------ Actual USE of #theme -------
$args = array('dataA' =&gt; $dataA, 'dataB' =&gt; $dataB, 'dataC' =&gt; $dataC);
$block-&gt;content = array(
  '#markup' =&gt; theme('MODULE_more_information', $args)
);
return $block;

// ------ hook_theme to attach the #theme to a template -------
function HOOK_theme($existing, $type, $theme, $path) {
  return array(
    'MODULE_more_information' =&gt; array(
      'template' =&gt; 'MODULE-more-information',
      'variables' =&gt; array('dataA' =&gt; '', 'dataB' =&gt; '', 'dataC' =&gt; ''),
      'path' =&gt; drupal_get_path('module', 'HOOK') . '/templates'
    )
  );
}

// ------ Actual template -------
&lt;div class=&quot;content&quot;&gt;
  &lt;h1&gt;&lt;?php print $dataA ?&gt;&lt;/h1&gt;
  &lt;h1&gt;&lt;?php print $dataB ?&gt;&lt;/h1&gt;
  &lt;h1&gt;&lt;?php print $dataC ?&gt;&lt;/h1&gt;
&lt;/div&gt;

You could even use the following, slightly different, method to build up the block content when using variables:
$block-&gt;content = array(
  '#theme' =&gt; 'MODULE_more_information',
  '#dataA' =&gt; $dataA,
  '#dataB' =&gt; $dataB,
  '#dataC' =&gt; $dataC,
);
return $block;

This second method makes the block more re-usable as the theme function hasn't already been called, and other parts of the system can still alter the individual elements of the block.