$wpdb->insert Giving duplicates

There is nothing that prevent duplicates here.

When you create the table 'church' is a good idea set a UNIQUE sql index for field email, in this way you can rely on email address to preventing duplicate entries.

As a generic PHP good practice, you should check the existence of a a variable before using it, using isset function:

/* If $_POST['email'] is setted and it is a valid email address */
if ( isset($_POST['email']) && filter_var($_POST['email'], FILTER_VALIDATE_EMAIL) ) {

  global $wpdb;
  $exists = $wpdb->get_var( $wpdb->prepare(
    "SELECT COUNT(*) FROM 'church' WHERE email = %s", $_POST['email']
  ) );

  if ( ! $exists ) {
    /* Your insert code here */
  }

}

P.S. Is also a good idea prepend the WordPress table prefix in front of custom table names.