Split node edit tab in several tabs with panels (or programmatically)
It sounds like you have done a lot of work already, and this continues to be a learning experience.  Since the form is now managed how you want it and it is only the data management in the save process that is causing you trouble, I would suggest a few code additions.  Using hook_form_ID_alter there are two methods you can try.

Method 1 Add a custom validation callback to the form.  

$form['#validate'][] = 'MYMODULE_node_data_validate';


Then in your new validation function I suggest loading the node ($node = node_load(nid);) and propagating the data into the form_state.  I am not sure this will work, but I have it listed as method 1 because it is the less disruptive path of the two that I have in mind at the moment.

Method 2 Replace the submit handler with your own.  Similar to the validate function mentioned above, the idea here is to load the node to get the data that was not present on the form that you edited.  However, this time you are going to invoke node_save yourself.  Also you will need to end with a drupal_goto or some other method of sending the user someplace.  Yes you could add an additional handler to the #submit array in the form variable, but either it will be too late to prevent the change the form is doing or it would just be a different name for method 1.

function hook_form_ID_alter(&amp;$form, &amp;$form_state, $form_id) {
    $form['#submit'] = array( 'hook_something_submit');
}
/**
 * Implements hook_form_FORM_ID_alter();
 */
function vts_nodedit_form_accompagn__node_form_alter(&amp;$form, &amp;$form_state, $form_id) {
    $form['#submit'] = array( 'vts_nodedit_data_submit');
}

function vts_nodedit_data_submit($form, &amp;$form_state) {
  // possible cause of missing data is that the form build populates
  $original = node_load( $form_state['node']-&gt;nid );

  // this drupal core function does the work of a full node edit save
  // but we have to have the node to hand it
  // and I do not trust all of $form['node'] in your instance
  field_attach_submit('node', $original, $form, $form_state);

  drupal_set_message(t('The changes have been saved.'));

  if( isset( $form_state['redirect']) ){
    drupal_goto( $form_state['redirect'] );
  } else {
    drupal_goto( '/home' );
  }
}


EDIT
The difference between form_state['input'] and form_state['values'] is that input is the raw $_POST from the user.  I think it would be a security concern to use that directly.  The other validators that are running (why we use $form['#validate'][] and append instead of replace) are taking the new data from input, cleaning it, and putting it in values.  Then if there are blank spots, they fill values with #default_value of the node.  Default is typically the existing value.  Therefore, a submit handler can ignore form_state[input] and have the benefits of drupal in just the form_state[values] array.
Input vs Values