This is a fiddle, but as you can see, the ones with less text in are matching the height of the tallest ones. Also, they are not appearing under each other to fill the space.
Yes something like this is the only way to do it cross browser.
Unfortunately you can’t do it in horizontal order (you can in chrome if you include flex as well and then re-order items but doesn’t work in Firefox and others).
However the beauty of css columns is that you can go down from 4 columns to one without media queries if you just include a width in the columns property which will act as a min-width for the column and then reduce columns automatically.
To stop items breaking you can use break-inside:avoid but some browsers don’t support that yet so if you look at the example I gave you will see in the comments that display:inline-block will keep blocks together.
display: inline-block; /* stops block being split across columns. Could use break-inside: avoid for modern browsers; */
break-inside: avoid;