A shortcode is a placeholder for a PHP callback. As placeholder, it is intended to be used where PHP can not be used directly.
do_shortcode() will do a regex in the passed string looking for all registered shortcodes, which is not appropiate from a performance point of view if you just want to execute one shortocode, not to look for all shortcodes in a string.
So, there is almost no reason to use
do_shortcode( '[my_shortcode]' ) in a template file; it is more appropiate to use the callback instead of the placeholder.
However, it is OK to use
do_shortcode() to parse strings or to filter content that may contain shortcodes that you want to be executed, but again a template file may be not the correct place to parse strings or filter content. For example, you may want to filter Text Widget content and allow shortcodes in it:
add_filter( 'widget_text', 'do_shortcode' );
do_shortcode() can be also useful when you need the functionality of a shortcode, no matter the exact output you get or what callback it is used, you need the functionality.
For example, a plugin/theme could redefine a shortcode, for example the gallery shortcode:
remove_shortcode( 'gallery', 'gallery_shortcode' );
add_shortcode( 'gallery', 'my_gallery_shortcode' );
In this case, if you need the gallery functionality, not the specific output of callback, using
do_shortcode( '[gallery]' ) within a theme could be justified. But no one should redeclare the gallery shortcode, instead
post_gallery filter should be used to modify the gallery shortcode output. So, the use of
do_shortcode('[gallery]') would be a very edge use case.
Same argument applies to any shortcode and the use of
do_shortcode() is a very edge case in general.