Ok, after having digged into WP source for a couple of hours, found a workaround. Simply tell wordpress to NOT remove old files.
Now files are 100% overwritten and cached files maintained.
Code is really simple
add_filter('upgrader_package_options', 'avoid_deletion', 999);
function avoid_deletion($options) {
if($options['hook_extra']['plugin'] == 'my-plugin/my-plugin.php') {
$options["clear_destination"] = false;
$options["abort_if_destination_exists"] = false;
}
return $options;
}
I will write lately an optional method to remove single folders/files just in case.