If "traditional javascript route" means creating a <script> element in the web page, its problem is that it runs in an unsafe context ("MAIN" world) where your code/data may be hijacked via "poisoned" prototypes and globals. Sometimes we have to use it to access the data or functions added by JS of the page, but generally it should be avoided and never trusted.
It's unclear what you mean by "use tabs / activeTab API instead of injecting the script programmatically" because the former is actually what "programmatic injection" is, i.e. chrome.tabs.executeScript and chrome.scripting.executeScript. The advantage of this method is that it can be used on demand, after the user interacted with the extension explicitly, so no unwanted code runs "by default". A common mistake I've seen is to declare a content script on all sites and use it only after the user clicked the extension, which wastes CPU/memory to run this script in every page the user opens.