You can do this with the Render API in Drupal 7 quite easily, specifically look at hook_page_alter()
. The Render API is a lot like the Forms API, you create content as arrays that describe the content, rather than creating raw HTML. Blocks are now created using these render arrays, which makes them very easy to manipulate from the module or theme layer. You can check out the documentation on the Render API for more details. Also, I found some Drupalcon videos quite helpful:
http://www.archive.org/details/drupalconchi_day3_the_render_api_in_drupal_7 and http://www.archive.org/details/PageRenderDrillDownInDrupal7 are good ones.
In your specific case, you'd implement hook_page_alter()
something like this assuming the block is called 'main-menu' and it's in the 'header' region of your page...
function mymodule_page_alter(&$page) {
// get the block you're after from the $page array
$menu_block = $page['header']['main-menu'];
// copy the block to another location in the page array
$page['footer']['main-menu'] = $menu_block;
}
This code grabs the definition of the 'main-menu' block and copies it to the footer region. This will cause Drupal to print the block twice. This specific example is also shown in at least one of the videos linked to above.