The problem is that your object is in a global variable
and so survives to global destruction. During global
destruction Perl just goes and destroys things in an
essentially random order.
This could be considered a bug in Perl (even though it was
documented) and will be fixed in Perl 5.8. However note
that the fix depends heavily upon the fact that Perl uses
reference counting, and not true garbage collection. It
would not be safe to assume that Perl 6 will necessarily
have reliable support for expected destruction mechanics.
In Perl 5.6 you could work around the issue by keeping
track of created objects through WeakRefs and then
in an END block destroying everything that didn't clean
itself up.
You might think that you could just have the ini object be
responsible for cleaning itself up, regardless of whether
you had a tied interface to it or not. Unfortunately
data that it depends upon might be cleaned up before it
is, leading to data corruption. So you are just moving
the problem around, but to really solve it you need to
guarantee that the destruction happens before global
destruction is hit.