After some digging in the core code (as the filters in this area appear to be mostly undocumented), I discovered that this is how WP does it.
$req = get_option( 'require_name_email' );
From there it is trivial to work out how to reformat the comment form.
$html5 = TRUE; // False if xhtml
$req = get_option( 'require_name_email' );
$html_req = ( $req ? " required='required'" : '' );
$commenter = wp_get_current_commenter();
$aria_req = ( $req ? " aria-required='true'" : '' );
if(!isset($commenter['comment_author'])){
$commenter['comment_author']='';
}
if(!isset($commenter['comment_author_email'])){
$commenter['comment_author_email']='';
}
if(!isset($commenter['comment_author_url'])){
$commenter['comment_author_url']='';
}
$comment_args = array(
'class_submit' => 'btn btn-outline-primary submit',
'comment_field' => '<p class="comment-form-comment"><label for="comment">' . _x( 'Comment', 'noun' ) . '</label> <textarea id="comment" name="comment" class="form-control" cols="45" rows="8" aria-required="true" required="required"></textarea></p>',
'fields' => array(
'author' => '<p class="comment-form-author">' . '<label for="author">' . __( 'Name' ) . ( $req ? ' <span class="required">*</span>' : '' ) . '</label> ' .
'<input id="author" name="author" class="form-control" type="text" value="' . esc_attr( $commenter['comment_author'] ) . '" size="30"' . $aria_req . $html_req . ' /></p>',
'email' => '<p class="comment-form-email"><label for="email">' . __( 'Email' ) . ( $req ? ' <span class="required">*</span>' : '' ) . '</label> ' .
'<input id="email" name="email" class="form-control" ' . ( $html5 ? 'type="email"' : 'type="text"' ) . ' value="' . esc_attr( $commenter['comment_author_email'] ) . '" size="30" aria-describedby="email-notes"' . $aria_req . $html_req . ' /></p>',
'url' => '<p class="comment-form-url"><label for="url">' . __( 'Website' ) . '</label> ' .
'<input id="url" name="url" class="form-control" ' . ( $html5 ? 'type="url"' : 'type="text"' ) . ' value="' . esc_attr( $commenter['comment_author_url'] ) . '" size="30" /></p>',
),
'format'=>'html5'
);
comment_form($comment_args);
If you are working with Bootstrap, your form now looks lovely.