It's not just handy for scripts, I think it's imperative in scripts where you want to go in and out of a lot of directories.
for i in foo bar baz; do
cd $i;
#... do something
cd ..;
done;
if "bar" doesn't exist, your cd .. will throw you off your original directory, whereas for i in foo bar baz; do
pushd $i;
#... do something
popd;
done;
you'll be guaranteed that after "popd" you're back in the right place to start a new iteration.