Why doesn’t is_page(id) work in functions.php?

is_page() relies on a complete global $wp_query object. If you call it before the action template_redirect has been fired, it might be impossible to get that data.

Wait for a proper action.

Example:

add_filter( 'template_include', function( $template ) {
    if ( is_page( 27 ) )
        echo 'this is the apply page';

    return $template;
});

You can call is_page() in a loop too.