(Disclaimer: I stopped doing COBOL some years ago. It fed me well for a number of years. The writeup below is far less than complete, though, but I will try to illustrate a number of points.)
Cobol has its uses in commercial data processing. Of course, commercial applications aren't exactly sexy - the same applies to COBOL.
Still, COBOL comes with features that are very handy in commercial applications, but mostly useless in something like a compiler:
BCD data types.
An accounting package just cannot use float for obvious reasons. Generally, COBOL allows for a lot of control over your data, includign the encoding and position of the sign, justification and other nifty things.
Arithmetic statements that allow for rounding (ROUNDED)
Greater control over what you do with your numbers.
powerful list formatting
Depending on dialect, you get everything including a report generator built into the language.
powerful, in-language, file access methods
Less important in the age of the data base, but anybody
trying to do ISAM access or even key sequential reads in other programming languages of similar age would have ended up with nightmarish code by comparison.
portability of the above to a number of platforms
Platform in this context does not mean different Microsoft operating systems or different Unix dialects. COBOL is portable between architectures as different from each other as MVS mainframes and outdated 16 bit minicomputers.
FORTRAN is as portable, maybe even more so. Ada, however cannot be beaten for portability but kicked for it's anal-retentiveness in loads of other areas.
Of course, COBOL also has disadvantages, many of them stemming from the fact that the language is older than most of today's computer users.
Strict source code formatting
Know your columns - OldCobbler's writeup tells you all about it.
Long, long, source code
There is no one-liner in COBOL. Something you'd write in a couple of lines in a modern language will fill pages and pages of COBOL code. Of course, this sometimes also works the other way around, in areas where COBOL is strong - processing well-formatted data.
ALTER will change the target of a GOTO during run time - most later compilers did not even support it.
CORRESPONDING when added to statements like ADD or MOVE, will add or move parts of one structure to another structure. Convenient if it works as advertized, but subject to arcane rules.
PERFORM procedure-name-1 THRU procedure-name-2
will allow you to execute more or less arbitrary parts of your program. If you also know that PERFORM is the preferred, goto-less loop concept (by default when it comes to classical COBOL), you might end up with constructs like:
PERFORM READ-DATA THRU DELETE-JUNK VARYING ORDER-INDEX FROM FIRST-ONE TO LAST-ONE BY 37 UNTIL DONE-THIS-STUFF.
No recursion, pointers, dynamic memory handling, high-level math finctions, or even functions.