Why is 'script' used in a transaction instead of the output address? I see transactions contain script for each output, but this "script" seems to be deterministically derived from the address associated with the output.

Why does the bitcoin protocol opt for the use of this script-derivative in the transaction instead of just using the output address plainly?
Scripts can be used to do a lot more thing than just pubkeys and signatures. There is an entire Bitcoin script language that can be used to specify things like multisigs, hashlocks, timelocks, conditionals, etc. It's pretty extensive, just hard to grasp and reason about. Such scripts do not map to addresses (before P2SH) so without having scripts in outputs, you would be locked into using only single pubkeys and signatures.