Шаблонизатор с функциями
Все работает:
echo preg_replace_callback(
  '@\[\+rand\(([0-9]+)-([0-9]+)\)\+\]@si' ,
  function($m){return rand(intval($m[1]), intval($m[2]));},
  'test [+rand(4-10)+] test');

А почему бы не использовать лексер/парсер? Скомпилировать шаблон в нативный код и уже его выполнять.