Как вызвать контроллер из другого контроллера?
Можно попробовать это сделать правилами роутинга, без одного общего контроллера. А контроллеры, можно вызвать так: 

list($controller) = Yii::app()->createController('site');
echo $controller->actionIndex();
Так тоже не получится.
в forward() вызывается CWebApplication::runController($route) без обработки. А при изначальном вызове парсится урл из запроса, параметры заносятся в _REQUEST и все такое:
$route=$this->getUrlManager()->parseUrl($this->getRequest());
$this->runController($route);

Так что надо сделать примерно вот так:
$request = Yii:app()->getRequest();
$request->pathInfo = $this->createUrl('/page/test', array('id'=>12));
$route=$this->getUrlManager()->parseUrl($request);
$this->runController($route);

Но я совсем не уверен, что вам удастся таким образом установить pathInfo в реквесте, так что еще проще
вручную записывать параметры в $_REQUEST[«id»]=$_GET["$id"]=12;

Но выглядит это все добро совсем не кошерно. Мне кажется удобней будет переписать UrlManager на свой лад. Просто если у вас запросы все обрабатываются в одном контроллере, который неведомым образом знает куда какой форвардить, то лучше это добро переписать внутрь UrlManager-a. Да и через него урлы формируются для новых страниц (вы же их не жестко прописываете?). Однажды там описать правила или хранить их в базе или где там надо и все.

Из описания проблемы не очень понятно… Если у вас есть несколько контроллеров Page, Product,… и есть урлы вида page1.html, product-cool.html соответственно, то и проблемы-то нет. Просто надо переписать правила роутинга для этих контроллеров. Вот для Page, например
'page<id:\d+>'=>'page/index', //$id перейдет в indexAction($id)

Для Product тож придумать можно
'product-<name:\w+>'=>'product/index', //$name перейдет в indexAction($name)
