I know this is a bit late (and a bit finicky), but...
><> (Fish), 47 45 47 Bytes (really 43 45, if I wasn't using the randomized direction)
x"!tenalP ,sgniteerG"!|o|!"Greetings, Planet!"x
These answers are a bit different to every other; there is a chance for either direction of code to be executed.
So, by "printing to console", I assumed you meant printing to stdout. This throws an error; the error is thrown to stderr AFTER the string is printed to stdout.
To prove that this worked both ways, I used the "random direction" director, "x". Fish is a two-dimensional language, so, no matter which way the director points, the code will still (eventually) be executed.
Assuming that the first director points to the right, the characters are loaded to the "stack" in reverse order, then the reverse of the reverse (or the normal text) is printed.
Assuming that both directors point to the left, the characters are, once again, loaded to the "stack" in reverse order (because the code loads it in backwards here, direction is to the left), then the reverse of the reverse (or the normal text) is printed.
If the randomized director points up or down, this won't matter - fish knows to loop to the underside or overside of the code, pointing back to the randomizer. In this way, it will continue to loop with the randomizers until it points inward, towards the code to execute.
The !|o|!
bit does the following, from both sides:
!
skips the next instruction (will always skip |
)
|
is a reflector; it points inward back towards o
.
o
outputs the current item of the stack to console as a character and removes it from the stack.
So, essentially, this is the "two mirrors in a bathroom pressed up together" trick, where I output until I can't anymore.
Now using a cat emoji. >o<
redirects the output inward infinitely, still throwing the error, but I can get away with not using a skip into reflection.
Turns out I was right the first time - the second attempt was not palindromic, but it was reflective.
Fish (without printing to stderr), 64 Bytes (ew)
x"!tenalP ,sgniteerG"!;oooooooooooooooooo;!"Greetings, Planet!"x
This dude's a little longer.
It has the same randomized arrow function (to prove it works both ways) and does not print to stderr.
The difference here is obvious; I literally print out every item in the stack, then end execution with ;
.
The !;
does not end execution immediately, as !
skips the next item (end exec, in this case) and continues until it hits the other side, which acts as ;!
, wherein it ends execution before it skips anything.
It follows the same randomized direction pattern as the shorter answer.