`sync` does everything `dirsync` does, plus more. Unfortunately this 'more' is a significant performance penalty. With `sync` enabled, all disk I/O is immediately written to disk. With `dirsync`, only directory operations are immediately written.
The only case I've seen where one might want to use `dirsync` instead of `sync` is in the case of network filesystems. When multiple boxes are working in a shared directory, they might try to create the file at around the same time. One box will create the file, but without `dirsync` on, the file isn't visible to other boxes yet. With `dirsync` on, the file will show up immediately, so the other servers at least know it exists and can now perform file locking on it.