There are some possibilities to change the structure of a drupal form. They are trigged at different times in the form building process, and therefor different things can be accomplished with those techniques.
Runs first. Add properties to the form. Your hook_form_alter implementions run before or after another module depending on the module weight.
2. custom #after_build function (added via a hook_form_alter)
Runs after the form array was built. Runs after hook_form_alter.
3. custom #pre_render function (added via a hook_form_alter)
Runs just before the form is rendered. Runs after #after_build.
Example use case
I needed to modify form_error messages after the conditional_fields module has processed the errors. As Conditional fields module does it's validation in an #after_build function, I needed to use a #pre_render function to run after the conditional field code.
Using form_alter alone and modifying the weight of my custom module did not help.