Script-tag apps inject JavaScript globally and hope it finds the right place in the DOM. Change themes, update a template, or install a second app doing the same thing, and you get render-order conflicts, duplicate elements, or an app that silently stops working with zero error message.
App blocks live inside the theme editor as actual, placeable sections — merchants control exactly where they render, Shopify controls the rendering lifecycle, and removing the app cleanly removes the block instead of leaving orphaned script tags behind.
If an app's setup instructions say "paste this script into theme.liquid," that's the old pattern. It still functions on most themes today, but it's the first thing we check when a store reports mysterious layout bugs after an app install.