Basically, the differences boil down to two things: the code you write them in and widgets are self-closing/void only--i.e. they cannot be containers/have closing tags. Unless you really need the ability to have a closing tag, and possibly child tags, widgets are generally just as good as macros, so use whichever you're more comfortable with.
Some people try to make a big deal out of performance, however, most of the time they're either blowing smoke or, in cases where they do attempt to measure performance, they're not actually measuring what they think they are. I wouldn't put too much stock into performance concerns.