Blocks in VisualWorks can be full, copying, clean, or inlined. Full blocks are most costly as they require a separate evaluation context, while clean blocks contain no references to outside variables and are compiled directly into the calling method. The programmer should aim to write code that uses clean blocks, such as by avoiding variable assignments, using streams instead of iterative methods, and utilizing inject:into: to suppress outside references. Defining blocks as cleanly as possible allows for better optimization by the compiler.