I haven't narrowed it down to a specific yet, but it appears as though your import routine is clobbering the $SUCCESS variable (perhaps confusing it with the constant with the same name), which is why things work if you use the packages in the opposite order (if Demo1 is loaded second, it initializes this variable *after* the clobbering in Demo2 has been done). You can see this for yourself by renaming $SUCCESS to something else. Also note that the use constant; line will be compiled/executed before the import sub is defined, which may have something to do with it.
Not all packages have to be loaded in specific order, but some do. For example, I'm working on a project right now that uses numerous packages (and BEGIN blocks). One package needs to initialize a piece of external hardware as soon as it is used, but before any of its functions are called, and then another module does some work with that hardware when it is used. If the first module isn't loaded, the second one will break.