The main problem with Racket's macro system (and with other syntax-case systems) is that instead of raw s-expressions you're dealing with syntax objects. This becomes very ugly when identifiers are handled: instead of dealing with plain symbols, you're dealing with these syntax values (called “identifiers” in this case) that are essentially a symbol and some opaque information that represents the lexical scope for its source. In several syntax-case systems this is the only difference from defmacro macros, but in the Racket case this applies to everything — identifiers, numbers, other immediate constants, and even function applications, etc — they are all wrapped with additional information.
CL's defmacro is available in Racket using (require mzlib/defmacro). I'd strongly advise actually learning Racket's macro system, however, because it allows you to write composable macros that cannot inadvertently capture variables while being able to introduce identifiers as needed.
CL's unhygienic macros are simple to write and understand, but they are not simple to use or compose. Racket's macros are exactly as hard to write as the actual task you're attempting to accomplish: a simple hygienic macro is trivial to write with define-syntax-rules, while a simple unhygienic macro is trivial to write with mzlib/defmacro. It's only when you're trying to do more complex stuff like selectively break hygiene that things get complicated.
DrRacket's macro stepper, incidentally, is very useful for seeing what a macro usage will expand into, and the automatic arrows from identifiers to the macro that introduced them are a life saver.