Can is_page and is_front_page both be true?

Indeed, if your site has a static page on the front, the condition is_page will be true and WP will never get to the elseif.

If you want a different template for your front page, you should exclude it from the first condition so it will return false in that case. Like this:

if ((is_single() || is_page()) && !is_front_page())

Or you can switch the statements around: first test for home/front and if that fails for single/page.