$form_state['values'] partial empty, while $form_state['input'] is filled
The reason drupal_get_form() doesn't work in your code is that it contains the following code.

  $form_state = array();

  $args = func_get_args();
  // Remove $form_id from the arguments.
  array_shift($args);
  $form_state['build_info']['args'] = $args;

  return drupal_build_form($form_id, $form_state);


What the function passes to the form builder is a newly created $form_state array, not the one being passed to your form builder.

Using drupal_build_form() is not working because the function is retrieving the form from the cache. (See the comments before the code.)

  // If the incoming input contains a form_build_id, we'll check the cache for a
  // copy of the form in question. If it's there, we don't have to rebuild the
  // form to proceed. In addition, if there is stored form_state data from a
  // previous step, we'll retrieve it so it can be passed on to the form
  // processing code.
  $check_cache = isset($form_state['input']['form_id']) &amp;&amp; $form_state['input']['form_id'] == $form_id &amp;&amp; !empty($form_state['input']['form_build_id']);
  if ($check_cache) {
    $form = form_get_cache($form_state['input']['form_build_id'], $form_state);
  }


You can implement hook_form_alter(), hook_form_FORM_ID_alter(), or hook_form_BASE_FORM_ID_alter() for a form that has been already altered.

About calling drupal_get_form() from a template file, see Be careful with drupal_get_form() in theme layer. As reported in that blog article, you would have problems with the validation error messages which will not appear.