Keep image EXIF info after compressing original image?

The problem is that you are using functions from GD library to manipulate images, not functions from WordPress Image API (WP_Image_Editor class). So, WordPress things doesn’t apply to the generated image by your code.

WordPress Image API uses ImageMagick if available, otherwise it uses GD library.

In order to keep EXIF data:

  1. If GD library is used, you need to install PHP wih the EXIF exension and configure PHP with --enable-exif flag.
  2. If ImageMagick is available, then WordPress will use it and EXIF and other meta data is preserved. Also, you have access to image_strip_meta filter (not availabe if GD library is used).

As you have ImageMagick installed, you could use it instead of GD library. Or, maybe better, use WordPress API:

add_filter( 'wp_handle_upload', 'wt_handle_upload_callback' );
function wt_handle_upload_callback( $data ) {

    // get instance of WP_Image_Editor class
    $image = wp_get_image_editor( $data['file'] );

    if( ! is_wp_error( $image ) ) {
        $image->set_quality( 85 );
        $image->save( $data['file'], $data['type'] );
    }

    return $data;
}

I’ve not tested the above code and I think you don’t need it. If the only prupose of doing all of this is to compress the image, you must know that the image is already compressed by WordPress to 82% quality (90 before WP 4.5). If you need to change the compression quality just use jpeg_quality filter:

add_filter( 'jpeg_quality', 'cyb_set_jpeg_quality' );
function cyb_set_jpeg_quality() {
    return 85;
}