Just for completeness, the following code taken from the get_pages() definition in includes/post.php shows that get_pages() hardcodes the = operator for comparing custom fields and so passing meta_compare to get_pages() has no effect. Pity.
if ( ! empty( $meta_key ) || ! empty( $meta_value ) ) {
$join = " LEFT JOIN $wpdb->postmeta ON ( $wpdb->posts.ID = $wpdb->postmeta.post_id )";
// meta_key and meta_value might be slashed
$meta_key = stripslashes($meta_key);
$meta_value = stripslashes($meta_value);
if ( ! empty( $meta_key ) )
$where .= $wpdb->prepare(" AND $wpdb->postmeta.meta_key = %s", $meta_key);
if ( ! empty( $meta_value ) )
$where .= $wpdb->prepare(" AND $wpdb->postmeta.meta_value = %s", $meta_value);
}
Passing meta_key => ‘my_field_name’, meta_value => ‘success’ will always result in a MySQL WHERE clause containing $wpdb->postmeta.meta_key = my_field_name AND $wpdb->postmeta.meta_value = success
I guess this also means that any posts/pages that you want to be evaluated must always have a custom field my_field_name assigned too.