That issue was supposed to be fixed back in Revo 2.2.9. Are you sure each context has a site_url and base_url context setting?
If that's not it -- I'm guessing here, but the makeUrl() that does the real work is actually a method of the context object, so this snippet might do it (in place of each link tag):
[[!GetUrl? &context=`web` &docId=`12`]]
<?php
/* GetUrl snippet */
// $currentContext = $modx->context->get('key');
$key = $modx->getOption('context', $scriptProperties, $modx->context->get('key'));
//$modx->switchContext($key);
$context = $modx->getObject('modContext', array('key' => $key));
$context->prepare();
$docId = $modx->getOption('docId', $scriptProperties, $modx->getOption('site_start'));
$url = $context->makeUrl($docId, "", "full");
// $modx->switchContext($currentContext);
return $url;
The call to $context->prepare() could have weird side effects. If it does, remove it and uncomment the three commented lines.